package com.Generics3;

public class Main {
    public static void main(String[] args) {
        Score<String> score1 = new Score<String>("数学", 123, "A+");
        //我们在定义泛型类的引用时，需要在后面指出此类型，引用类型和new类型两者保持一样的类型

        //如果不希望指定类型，或者希望此引用类型可以引用任意泛型的Score类对象，可以使用?通配符，来表示自动匹配任意的可用类型
        Score<?> score2 = new Score<String>("英语", 123, "A+");
        //使用通配符后，score可以引用任意的Score类型对象了，那使用统配后，得到的泛型成员变量会是什么类型
        /*
        String str = score2.score; //这行报错了,提示需要的是String，提供的是capture of，即Object类型
        Required type:  String
        Provided:       capture of ?
        做一下转换就可以了
         */
        String str = (String) score2.score;  //一旦使用的通配符，编译器无法进行类型推断，引用的类型就变成了最原始的用法Object类型
        //一般不用通配符，除非框架开发或反射的时候用通配符

        //new Store<>()的<>里面可以省略不写，自动根据传入的实参判断类型，这种写法叫钻石运算符，<>形状像钻石，且一样透明剔透
        Score<Integer> score3 = new Score<>("英语", 123, 100);

    }
}
